﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez.Produccion.Compras;
using BussinessLogicTecnoPez.Produccion.Clasificacion_e_Incubacion;
using BussinessLogicTecnoPez.Tipos_Comunes;
using ASP;
using Tecnopez.Globals;
using BussinessLogicTecnoPez;
using System.Collections.Generic;

public partial class Modules_ClasificacionIncubacion_RegistrarLoteAIncubar : System.Web.UI.Page
{

    private List<DetalleIncubacionOvas> listaDetalles;
    protected void Page_Load(object sender, EventArgs e)
    {
        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/ic_soporte.gif";
        master.Titulo = "Registrar lote de ovas a incubar.";


        if (ViewState["detalleIncubacion"] == null)
        {
            listaDetalles = new List<DetalleIncubacionOvas>();
        }
        else
        {
            listaDetalles = (List<DetalleIncubacionOvas>)ViewState["detalleIncubacion"];
        }


        InicializarGrillaDeLotes();
        InicializarGrillaDeAsignacion();
        if (!IsPostBack)
        {
            multiViewPrincipal.SetActiveView(viewSeleccionLote);
            calFechaInicio.Text = DateTime.Now.ToShortDateString();
        }

    }

    private void InicializarGrillaDeAsignacion()
    {
        DataControlField[] extraButtons = new DataControlField[1];
        ButtonField colB = new ButtonField();
        colB.ButtonType = ButtonType.Image;
        colB.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        colB.HeaderText = "";
        colB.CommandName = "Quitar";
        colB.HeaderStyle.Width = 5;
        colB.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
        extraButtons[0] = colB;
        this.grdAsignaciones.setupGrid(typeof(DetalleIncubacionOvas), CargarGrillaDeAsignacion, false, false, ViewState, extraButtons);

    }

    private void CargarGrillaDeAsignacion()
    {

        grdAsignaciones.DataSource = listaDetalles;
        grdAsignaciones.DataBind();
    }

    private void BorrarAsignacion(int indice)
    {

    }


    private void InicializarGrillaDeLotes()
    {
        DataControlField[] extraButtons = new DataControlField[1];
        ButtonField colB = new ButtonField();
        colB.ButtonType = ButtonType.Image;
        colB.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/mas.gif";
        colB.HeaderText = "Seleccionar";
        colB.CommandName = "Seleccionar";
        colB.HeaderStyle.Width = 5;
        colB.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
        extraButtons[0] = colB;
        grdLoteOvas.setupGrid(typeof(LoteOva), cargarGrillaLoteDeOvas, true, true, ViewState, extraButtons);

    }

    private void seleccionarLoteDeOva(int indice)
    {
        try
        {

            cargarGrillaLoteDeOvas();
            //if (grdAsignaciones.Rows[0].Cells[0].ToString() == string.Empty)
            //{
            //    lblMensaje.Text = "No hay lote de ovas disponibles para incubar.";
            //    return;
            //}

            int idLoteDeOva = (int)grdLoteOvas.DataKeys[indice].Value;
            LoteOva.getManager.ClearFilters();
            LoteOva.getManager.AddFilter(grdLoteOvas.DataKeyNames[0], BussinessLogicTecnoPez.GenericManager<LoteOva>.filterOperator.Equals, idLoteDeOva);
            LoteOva aux = LoteOva.getManager.GetOne();
            ViewState["idLoteDeOva"] = aux.IdLoteOva;
            lblCantLoteOvas.Text = aux.Cantidad.ToString();
            lblCodigoLote.Text = aux.Codigo.ToString();
            lblEspecie.Text = aux.Especie.ToString();
            lblProveedorLote.Text = aux.Proveedor.ToString();
            txtOvasRestantes.Text = aux.Cantidad.ToString();
            lstEstanques.DataSource = Estanque.obtener("", "", false, Estanque.tipoEstanque.estIncubacion);
            lstEstanques.DataTextField = "descripcionEnLinea";
            lstEstanques.DataValueField = "idEstanque";
            lstEstanques.DataBind();
            multiViewPrincipal.SetActiveView(viewAsociaciónEstanques);
        }
        catch
        {
            lblMensaje.Text = "Error: no se pudó selecionar el lote de ovas, reintente más tarde.";
        }
    }

    private void cargarGrillaLoteDeOvas()
    {
        TipoEstadoLoteOvas estadoPendiente;
        TipoEstadoLoteOvas.getManager.ClearFilters();
        TipoEstadoLoteOvas.getManager.AddFilter("IdTipoEstadoLoteOva",
                    GenericManager<TipoEstadoLoteOvas>.filterOperator.Equals,
                    (int)TipoEstadoLoteOvas.estadosLoteOva.PendienteAIncubar);
        estadoPendiente = TipoEstadoLoteOvas.getManager.GetOne();
        LoteOva.getManager.ClearFilters();
        LoteOva.getManager.ClearOrders();
        LoteOva.getManager.AddFilter("TipoEstadoLoteOva", GenericManager<LoteOva>.filterOperator.Equals, estadoPendiente.IdTipoEstadoLoteOva);
        
        if(grdLoteOvas.getPageDataViewOrderKeyValue(ViewState)==null)
        {
            LoteOva.getManager.AddOrder("IdLoteOva", GenericManager<LoteOva>.Order.orderDirection.DESC);
        }
        else
        {

            if (grdLoteOvas.getPageDataViewOrderKeyValue(ViewState) == "FechaString")
            {
                LoteOva.getManager.AddOrder("FechaIngreso", grdLoteOvas.getPageDataViewOrdenDireccionKeyValue<LoteOva>(ViewState));
            }
            else
            {
                LoteOva.getManager.AddOrder(grdLoteOvas.getPageDataViewOrderKeyValue(ViewState), grdLoteOvas.getPageDataViewOrdenDireccionKeyValue<LoteOva>(ViewState));
            }
        }
        List<LoteOva> lista = new List<LoteOva>();
        lista = LoteOva.getManager.GetFilter();
        grdLoteOvas.DataSource = lista;
        grdLoteOvas.DataBind();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        multiViewPrincipal.SetActiveView(viewSeleccionLote);
    }
    protected void btnAceptar_Click(object sender, EventArgs e)
    {
        if ((Convert.ToInt64(txtOvasRestantes.Text)) > 0 || Convert.ToInt64(txtOvasRestantes.Text) < 0)
        {
            lblMensajeRemoveOvas.Text = "Por favor asigne el total de lote de ovas a estanques de incubación para continuar.";
        }
        else
        {
            multiViewPrincipal.SetActiveView(viewConfirmacion);
            grdConfirmacionAsignacin.setupGrid(typeof(DetalleIncubacionOvas), cargarGrillaConfirmacion, false, false, ViewState,null);
            lblCantLoteOvasP.Text = lblCantLoteOvas.Text;
            lblCodigoLoteP.Text = lblCodigoLote.Text;
            lblEspecieP.Text = lblEspecie.Text;
            lblProveedorLoteP.Text = lblProveedorLote.Text;
        }
    }

    public void cargarGrillaConfirmacion()
    {
        listaDetalles = ViewState["detalleIncubacion"] as List<DetalleIncubacionOvas>;
        grdConfirmacionAsignacin.DataSource = listaDetalles;
        grdConfirmacionAsignacin.DataBind();
    }

    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        Int64 ovasAAsignar, ovasRestantes;
        Int32 idEstanque;
        lblMensajeRemoveOvas.Text = "";
        lblMensajeAddOvas.Text = "";
        if (lstEstanques.SelectedValue != string.Empty)
        {
            if (Int32.TryParse(lstEstanques.SelectedValue, out idEstanque))
            {
                if (Int64.TryParse(txtOvasAAsignar.Text, out ovasAAsignar) && Int64.TryParse(txtOvasRestantes.Text, out ovasRestantes))
                {
                    Estanque estanque = Estanque.getManager.GetOneByPrimaryKey(idEstanque);
                    if (estanque == null)
                    {
                        lblMensaje.Text = "El estanque seleccionado ya no esta disponible en la base de datos.";
                    }
                    else
                    {
                        if (estanque.capacidad < ovasAAsignar || ovasAAsignar > ovasRestantes || ovasAAsignar <= 0)
                        {
                            lblMensajeAddOvas.Text = "La cantidad de ovas a asignar no es válida, por favor verifique que no esa superior a las ovas restantes ni sea menor que cero";
                        }
                        else
                        {
                            listaDetalles.Add(new DetalleIncubacionOvas(idEstanque, ovasAAsignar));
                            txtOvasRestantes.Text = Convert.ToString((ovasRestantes - ovasAAsignar));
                            ViewState["detalleIncubacion"] = listaDetalles;
                            txtOvasAAsignar.Text = string.Empty;
                            CargarGrillaDeAsignacion();

                        }
                    }
                }
                else
                {
                    lblMensajeAddOvas.Text = "El formato del número ingresado no es válido o esta fuera de un rango lógico.";
                }
            }
            else
            {
                lblMensajeAddOvas.Text = "Error al seleccionar el estanque.";
            }
        }
        else
        {
            lblMensajeAddOvas.Text = "Seleccione un estanque de incubación para realizar la asignación.";
        }

    }

    protected void grdLoteOvas_RowCommand(object sender, GridViewCommandEventArgs e)
    {

        try
        {
            int o = int.Parse(e.CommandArgument.ToString());
            seleccionarLoteDeOva(o);
        }
        catch 
        {
            
           
        }
    }

    protected void grdLoteOvas_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
    protected void grdAsignaciones_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        int o = int.Parse(e.CommandArgument.ToString());
        if (grdAsignaciones.Rows[o].Cells[0].Text != "&nbsp;")
        {
            txtOvasRestantes.Text = Convert.ToString(Convert.ToInt64(txtOvasRestantes.Text) +
                                     Convert.ToInt64(grdAsignaciones.Rows[o].Cells[2].Text));
            listaDetalles.RemoveAt(o);
            ViewState["detalleIncubacion"] = listaDetalles;
            CargarGrillaDeAsignacion();
            if (listaDetalles.Count == 0)
                InicializarGrillaDeAsignacion();
        }
        else
        {
            lblMensajeRemoveOvas.Text = "Para remover una asignación, es necesario que primero agregue un item a la lista.";
        }
    }
    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        Response.Redirect("RegistrarLoteAIncubar.aspx");
    }

    protected void btnNo_Click(object sender, EventArgs e)
    {
        multiViewPrincipal.SetActiveView(viewAsociaciónEstanques);

    }
    protected void btnSi_Click(object sender, EventArgs e)
    {

    }
    protected void btnConfirmarIncubacion_Click(object sender, EventArgs e)
    {
        listaDetalles = ViewState["detalleIncubacion"] as List<DetalleIncubacionOvas>;
        int idloteDeova = Convert.ToInt32(ViewState["idLoteDeOva"]);
        double tamanio;
        double peso;
        DateTime fecha;
        grdConfirmacionAsignacin.setupGrid(typeof(DetalleIncubacionOvas), cargarGrillaConfirmacion, false, false, ViewState, null);
        cargarGrillaConfirmacion();
        if (!DateTime.TryParse(calFechaInicio.Text,out fecha))
        {
            lblMensajeDeErrorUltimoPaso.Text = "La fecha no es válida.";
            return;
        }

        if (double.TryParse(txtTamanioInicial.Text, out tamanio) && double.TryParse(txtPesoInicial.Text, out peso))
        {

            Clasificacion c = new Clasificacion();
            c.comenzarIncubacion(peso, fecha, tamanio);

            foreach (DetalleIncubacionOvas det in listaDetalles)
            {
                c.registrarIncubacion(det.estanque.idEstanque, idloteDeova, det.cantidad);
            }

            lblTitFin.Text = "Registro de incubación realizado.";
            Functions.MessageBox(lblTitFin.Text, this);
            btnConfirmarIncubacion.Visible = false;
            btnCancelarLast.Visible = false;
            txtPesoInicial.ReadOnly = true;
            txtTamanioInicial.ReadOnly = true;
            grdConfirmacionAsignacin.setupGrid(typeof(DetalleIncubacionOvas), cargarGrillaConfirmacion, false, false, ViewState,null);
            lblMensajeDeErrorUltimoPaso.Text = "";

        }
        else
        {
            lblMensajeDeErrorUltimoPaso.Text = "Por favor verifique que el tamaño inicial y/o el peso tengan un formato númerico válido.";
        }

    }
    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {

    }
}
